package editor.main;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.LinkedList;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

import server.buscador.ANode;
import server.buscador.AStar;
import server.buscador.NodeEdge;
import server.buscador.SpaceNode;
import editor.dxf.DxfModel;
import editor.graphics.Dibujable;
import editor.graphics.EditorMapa;
import editor.modelo.ExcelInterface;
import editor.modelo.Floor;
import editor.modelo.EditorFloor;
import editor.modelo.JSONConverter;
import editor.modelo.LandMark;
import editor.modelo.ModelUtilities;
import editor.modelo.Portal;
import editor.modelo.Space;
import editor.modelo.Portal.Clase;

import java.awt.Font;
import javax.swing.JTextField;
import java.awt.GridLayout;
import javax.swing.BoxLayout;
import java.awt.GridBagLayout;
import java.awt.FlowLayout;
import javax.swing.ScrollPaneConstants;
import javax.swing.JCheckBox;

public class Main {

	private JFrame frmEditorAulas;
	private EditorMapa editorMapa;

	private BuildingManager buildingManager;

	// private File workingDir;
	private JLabel lblEdificio;
	private JTextField txtDifx;
	private JTextField txtDifY;
	private JTextField txtAncho;
	private JTextField txtAlto;
	private JTextField txtEscala;
	private JTextField txtRot;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main window = new Main();
					window.frmEditorAulas.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public Main() {
		buildingManager = new BuildingManager();
		initialize();
	}

		// /Esto es para borrar.. es de prueba.
		//DxfModel mod = new DxfModel("CuerpoA", Integer.valueOf(200),Integer.valueOf(200), // escala
		//		Integer.valueOf(0) // rotacion
		/*
		 * Integer.valueOf(-200), //fix x Integer.valueOf( 1050), //fix y
		 * Integer.valueOf(2000), // width Integer.valueOf(1300) //height
		 *);
		// editorMapa.setFondo(mod);

		// DxfModel mod = new DxfModel("./Alem/CuerpoB_pb.dxf", 250, 0);
		// editorMapa.setFondo(mod);


	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		try {
			// Set System L&F
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception e) {
			// handle exception
		}

		frmEditorAulas = new JFrame();
		frmEditorAulas.setTitle("Editor Aulas");
		frmEditorAulas.setBounds(100, 100, 971, 747);
		frmEditorAulas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmEditorAulas.getContentPane().setLayout(new BorderLayout(0, 0));

		JPanel panel_1 = new JPanel();
		frmEditorAulas.getContentPane().add(panel_1, BorderLayout.NORTH);
		panel_1.setLayout(new BorderLayout(0, 0));

		JMenuBar menuBar = new JMenuBar();
		panel_1.add(menuBar, BorderLayout.CENTER);

		JMenu mnArchivo = new JMenu("Archivo");
		menuBar.add(mnArchivo);

		JMenuItem mntmAbrir = new JMenuItem("Abrir...");
		mntmAbrir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			}
		});
		mnArchivo.add(mntmAbrir);
		mnArchivo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				guardarActual();
			}
		});
		
		JMenuItem menuExport = new JMenuItem("Exportar...");
		menuExport.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				ExcelInterface xl = new ExcelInterface();
				// xlReader.init("./Julio.xls");
				xl.writeFloors();
				//xlReader.readFloors();
			}
		});
		mnArchivo.add(menuExport);
		
		JMenuItem menuImport = new JMenuItem("Importar...");
		mnArchivo.add(menuImport);
		menuImport.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ExcelInterface xl = new ExcelInterface();
				// xlReader.init("./Julio.xls");
				xl.readFloors();
				//xlReader.readFloors();
			}
		});

		JMenuItem mntmSalir = new JMenuItem("Salir");
		mnArchivo.add(mntmSalir);

		JMenu mnEdificio = new JMenu("Edificio");
		menuBar.add(mnEdificio);

		JMenuItem mntmCrear = new JMenuItem("Crear");
		mntmCrear.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				crearEdificio();
			}
		});

		JMenuItem mntmGuardar = new JMenuItem("Guardar Piso");
		mntmGuardar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
					guardarActual();
			}
		});
		mnEdificio.add(mntmGuardar);

		JMenuItem mntmGuardarComo = new JMenuItem("Guardar Todo");
		mnEdificio.add(mntmGuardarComo);
		mntmGuardarComo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				guardarTodo();
			}
		});
		mnEdificio.add(mntmCrear);

		JMenuItem mntmCargar = new JMenuItem("Cargar");
		mntmCargar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cargarEdificio();
			}
		});
		mnEdificio.add(mntmCargar);

		JMenuItem mntmGenerar = new JMenuItem("Generar");
		mntmGenerar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				generarMapa();
			}
		});
		mnEdificio.add(mntmGenerar);

		editorMapa = new EditorMapa();
		editorMapa.setBackground(new Color(255, 250, 250));
		editorMapa.setPreferredSize(new Dimension(500, 10));
		frmEditorAulas.getContentPane().add(editorMapa, BorderLayout.CENTER);

		JPanel panel = new JPanel();
		panel.setPreferredSize(new Dimension(150, 10));
		frmEditorAulas.getContentPane().add(panel, BorderLayout.EAST);
		panel.setLayout(null);

		JSlider slider = new JSlider();
		slider.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				editorMapa.setZoom(((JSlider) e.getSource()).getValue());
			}
		});
		slider.setMajorTickSpacing(50);
		slider.setPaintLabels(true);
		slider.setPaintTicks(true);
		slider.setValue(100);
		slider.setToolTipText("Zoom del editor");
		slider.setMaximum(200);
		slider.setMinimum(25);
		slider.setBounds(-1, 23, 151, 60);
		panel.add(slider);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(0, 125, 150, 214);
		panel.add(scrollPane);

		scrollPane.setViewportView(buildingManager.getFloorsTable());

		JButton btnEditar = new JButton("Editar");
		btnEditar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				editarSeleccionado();
			}

		});
		btnEditar.setBounds(0, 350, 74, 23);
		panel.add(btnEditar);

		lblEdificio = new JLabel("Edificio");
		lblEdificio.setHorizontalAlignment(SwingConstants.CENTER);
		lblEdificio.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		lblEdificio.setBounds(9, 88, 120, 23);
		panel.add(lblEdificio);

		JButton btnNuevoPiso = new JButton("Nuevo Piso");
		btnNuevoPiso.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				buildingManager.agregarNuevoPiso();
			}
		});
		btnNuevoPiso.setBounds(22, 0, 107, 23);
		panel.add(btnNuevoPiso);

		JPanel panel_2 = new JPanel();
		panel_2.setBounds(-1, 416, 150, 80);
		panel.add(panel_2);
		panel_2.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));

		JLabel lblDifX = new JLabel("DIF X:");
		lblDifX.setMinimumSize(new Dimension(14, 14));
		panel_2.add(lblDifX);

		txtDifx = new JTextField();
		txtDifx.setPreferredSize(new Dimension(15, 20));
		panel_2.add(txtDifx);
		txtDifx.setColumns(3);

		JLabel lblDifY = new JLabel("DIF Y:");
		panel_2.add(lblDifY);

		txtDifY = new JTextField();
		panel_2.add(txtDifY);
		txtDifY.setColumns(3);

		JLabel lblAncho = new JLabel("ANCH:");
		panel_2.add(lblAncho);

		txtAncho = new JTextField();
		panel_2.add(txtAncho);
		txtAncho.setColumns(3);

		JLabel lblAlto = new JLabel("ALTO:");
		panel_2.add(lblAlto);

		txtAlto = new JTextField();
		panel_2.add(txtAlto);
		txtAlto.setColumns(3);

		JLabel lblEscala = new JLabel("Escala:");
		panel_2.add(lblEscala);

		txtEscala = new JTextField();
		panel_2.add(txtEscala);
		txtEscala.setColumns(3);

		JLabel lblRotac = new JLabel("Rotac:");
		panel_2.add(lblRotac);

		txtRot = new JTextField();
		panel_2.add(txtRot);
		txtRot.setColumns(3);

		JButton btnAplicar = new JButton("OK Visibles");
		btnAplicar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				aplicarCambiosTabla();
			}
		});
		btnAplicar.setBounds(80, 350, 70, 23);
		panel.add(btnAplicar);
		
		JButton btnRstHght = new JButton("Rst Hght");
		btnRstHght.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ModelUtilities.resetHeight(editorMapa.getPisoEnEdicion());
			}
		});
		btnRstHght.setBounds(-1, 507, 89, 23);
		panel.add(btnRstHght);
		
		JButton btnCalHght = new JButton("Cal Hght");
		btnCalHght.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ModelUtilities.calculateHeights(editorMapa.getPisoEnEdicion());
			}
		});
		btnCalHght.setBounds(-1, 534, 89, 23);
		panel.add(btnCalHght);
		
		JButton button = new JButton("Parse Floor");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int r = JOptionPane
						.showConfirmDialog(null,
								"Esta seguro que desea generar el piso? (si ya se hizo va a ser una chanchada de spaces) \n" +
								"Puede generar un solo space clickeando mientras mantiene Alt");
				if (r == JOptionPane.YES_OPTION) {
					((DxfModel)editorMapa.fondo).generateFloor(editorMapa.getPisoEnEdicion());
				}
			}
		});
		button.setBounds(-1, 384, 89, 23);
		panel.add(button);

	}


	protected void aplicarCambiosTabla() {
		editorMapa.setPisoVisible((ArrayList<EditorFloor>) buildingManager
				.getVisibleFloors());
		editorMapa.setFondos(buildingManager.getSelectedDxfs());
		editorMapa.repaint();
	}

	protected void editarSeleccionado() {
		Floor p = buildingManager.getSelectedFloor();
		if (p != null) {
			editorMapa.setSelectedFloor((EditorFloor) p);
		 	editorMapa.setFondo(buildingManager.getSelectedDxf_());
		 //	buildingManager.getSelectedDxf_().setScalebyX(Integer.parseInt(txtDifx.getText()));
		 //	buildingManager.getSelectedDxf_().setScalebyY(Integer.parseInt(txtDifY.getText()));
		}
	}

	protected void guardarTodo() {
		buildingManager.guardarTodo();

	}

	protected void crearEdificio() {
		JFileChooser jfc = new JFileChooser(".");
		jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		jfc.setVisible(true);
		int returnVal = jfc.showOpenDialog(frmEditorAulas);
		if (returnVal != JFileChooser.APPROVE_OPTION)
			return;

		editorMapa.clean();
		File workingDir = jfc.getSelectedFile();

		buildingManager.crearEdificio(workingDir);
		lblEdificio.setText(workingDir.getName());
	}

	private void cargarEdificio() {
		JFileChooser jfc = new JFileChooser(".");
		jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		jfc.setVisible(true);
		int returnVal = jfc.showOpenDialog(frmEditorAulas);
		if (returnVal != JFileChooser.APPROVE_OPTION)
			return;

		editorMapa.clean();
		File workingDir = jfc.getSelectedFile();

		buildingManager.loadBuilding(workingDir);

		lblEdificio.setText(workingDir.getName());
	}

	protected void guardarActual() {
		int r = JOptionPane
				.showConfirmDialog(null,
						"Esta seguro que desea guardar los cambios? Se sobreescribira todo lo anterior");
		if (r == JOptionPane.YES_OPTION) {
			buildingManager.guardarActual();
		}
	}

	protected void generarMapa() {
		int r = JOptionPane
				.showConfirmDialog(
						null,
						"Se sobreescribiran TODOS los mapas, se controlara el formato (corregira), se linkearan y se generara la lista de espacios actualizada.");
		if (r == JOptionPane.YES_OPTION) {
			editorMapa.clean();
			buildingManager.generarEdificio();
			
		}
		editorMapa.repaint();
	}
}
